#include "spi.h"
/*
	1、四线、全双工、串行、高低位先行可选、同步通信总线，单主机、多从机，主要用于近距离、高速芯片和设备之间通信
	
	2、MISO:主设备输入/从设备输出引脚。
	   MOSI:主设备输出/从设备输入引脚。
	   SCLK：串行时钟信号，由主设备产生。
	   CS：片选，多从机下用来选择和哪一个从机进行通信，低电平有效
	   
	3、SPI时钟
	CPOL(时钟极性)：用来确空闲时时钟线的电平状态（高/低）				
	CPHA(时钟相位)：用来确数据的采样和输出分别是在哪一个时钟边沿
			
	4、SPI通信的四种模式
	模式0：时钟在空闲时为低电平，数据在时钟前沿采样（数据不允许改变），后沿输出（允许改变）
	模式1：时钟在空闲时为低电平，数据在时钟前沿输出，后沿采样
	模式2：时钟在空闲时为高电平，数据在时钟前沿采样（数据不允许改变），后沿输出（允许改变）
	模式3：时钟在空闲时为高电平，数据在时钟前沿输出，后沿采样
	5、SPI通信，若想获得数据必须先向从对方发送一个无效（一般为0xff）或有效数据,对方才能回应。
*/
//void spiInit(void)
//{
//	GPIO_InitTypeDef GPIO_InitStruct;
//	SPI_InitTypeDef SPI_InitStruct;
//	
//	//开启GPIO和复用功能SPI的时钟
//	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_GPIOE, ENABLE);
//	RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
//	//开启GPIO复用功能
//	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
//	GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
//	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5;
//	GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
//	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
//	GPIO_Init(GPIOB, &GPIO_InitStruct);
//	
//	//配置SPI1的CS线
//	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
//	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2;
//	GPIO_Init(GPIOB, &GPIO_InitStruct);
//	//配置LORA的CS线，防止干扰SPI信号
//	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1;
//	GPIO_Init(GPIOE, &GPIO_InitStruct);
//	//空闲拉高所有CS片选线，防止信号干扰
//	GPIO_SetBits(GPIOE, GPIO_Pin_1);
//	GPIO_SetBits(GPIOB, GPIO_Pin_2);
//	//配置GPIO的具体复用功能
//	GPIO_PinAFConfig(GPIOB, GPIO_PinSource3, GPIO_AF_SPI1);
//	GPIO_PinAFConfig(GPIOB, GPIO_PinSource4, GPIO_AF_SPI1);
//	GPIO_PinAFConfig(GPIOB, GPIO_PinSource5, GPIO_AF_SPI1);
//	
//	//配置SPI参数
//	SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;	//波特率
//	SPI_InitStruct.SPI_CPHA = SPI_CPHA_2Edge;	//前沿输出，后沿采样
//	SPI_InitStruct.SPI_CPOL = SPI_CPOL_High;	//时钟极性，空闲时为高电平
//	SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b;	//数据为八位
////	SPI_InitStruct.SPI_CRCPolynomial = 7;	//用于CRC计算的多项式,一般为7
//	SPI_InitStruct.SPI_Direction = SPI_Direction_2Lines_FullDuplex;	//传输方向为两向全双工
//	SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_MSB;	//数据传输从MSB开始，高位先行
//	SPI_InitStruct.SPI_Mode = SPI_Mode_Master;	//模式选择为主机
//	SPI_InitStruct.SPI_NSS = SPI_NSS_Soft;	//片选为软件
//	SPI_Init(SPI1, &SPI_InitStruct);
//	SPI_Cmd(SPI1, ENABLE);//使能SPI外设
//}
//
//uint8_t spiWriteData(uint8_t wdata)
//{
//	uint8_t read_data = 0;
//	while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);//等待发送区空
//	SPI_I2S_SendData(SPI1, wdata);
//	while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);//等待接收完一个byte
//	read_data = SPI_I2S_ReceiveData(SPI1);
//	return read_data;	//返回通过SPI最近接收的数据
//}
